<?php

class Ext_Utils_Print
{

    /**
     * Funcion utilidad para imprimir
     *
     * @param   string  el comando que hay que ejecutar (se reemplazan los strings queue_name y files)
     * @param   string  $printerQueue el nombre de la cola a la que hay 
     *                  que imprimir, cups://user:pass@host:port/queueName?jobName.
     *                  Se reemplaza (queue_name) en el command 
     * @param   string  $printerBuff lo que se manda por stdin, puede 
     *                  ser la clave o el buffer directamente si se quiere imprimir algo chico
     * @param   string  $printFiles el listado de files a imprimir se reemplaza en el command
     * @return  string  $ret    el buffer que devolvio el comando lpr
     */
    static public function sendToPrinterQueue( $lprCommand, $printerQueue, $printBuff = null, $printFiles = null )
    {
        
        $parsed = parse_url( $printerQueue );
        if ( $parsed && ! isset( $parsed[ 'scheme' ] ) ) {
            $printerQueue = $parsed[ 'path' ];
        } else {
            if ( $parsed && ! strcasecmp( $parsed[ 'scheme' ], 'cups' ) ) {
                if ( isset( $parsed[ 'path' ] ) ) {
                    $hostPart = " -E " . $parsed[ 'host' ];
                    if ( isset( $parsed[ 'port' ] ) ) {
                        $hostPart .= ':' . $parsed[ 'port' ];
                    }
                    $lprCommand .= $hostPart;
                    if ( isset( $parsed[ 'user' ] ) ) {
                        $lprCommand .= " -U " . $parsed[ 'user' ];
                    }
                    if ( isset( $parsed[ 'query' ] ) ) {
                        $options = array();
                        parse_str( $parsed[ 'query' ], $options );
                        foreach ( $options as $name => $value ) {
                            if ( is_array( $value ) ) {
                                $lprCommand .= " -o " . $name;
                                if ( ! empty( $value ) ) {
                                    $lprCommand .= "=" . implode( ',', $value );
                                }
                            } else {
                                if ( $value == 'job-name' ) {
                                    $lprCommand .= " -J " . $value;
                                } else {
                                    $lprCommand .= " -o " . $name;
                                    if ( ! empty( $value ) ) {
                                        $lprCommand .= "=" . $value;
                                    }
                                }
                            }
                        }
                    
                    }
                    $printerQueue = substr( $parsed[ 'path' ], 1 );
                } else {
                    $printerQueue = $parsed[ 'host' ];
                }
            }
        }
        
        if ( ! empty( $printerQueue ) ) {
            $lprCommand = str_ireplace( 'queue_name', $printerQueue, $lprCommand );
        }
        
        if ( is_array( $printFiles ) ) {
            $printFiles = implode( ' ', $printFiles );
        }
        if ( ! empty( $printFiles ) ) {
            $lprCommand = str_ireplace( 'print_files', $printFiles, $lprCommand );
        }
        return Ext_Utils_Execute::Execute( $lprCommand, $printBuff );
    }
}
